﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeltaMod
{
    class Parser
    {
        public double Speed { get; set; } //фактическая скорость самолета в даный момент времени
        public double Acceleration { get; set; } //фактическое ускорение в данный момент времени
        public double Xi { get; set; } //фактическое расположение самолета по координате Х в данный момент времени
        public double Yi { get; set; } //фактическое расположение самолета по координате Y в данный момент времени
        public double Zi { get; set; } //фактическое расположение самолета по координате Z в данный момент времени

    }
    public class Coord//идеальные координаты
    {

        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }
    }

    public class Parameter//общие параметры
    {
        public double Speed { get; set; }
        public double Acceleration { get; set; }
        public Coord Coord { get; set; }
        public Limit Limit { get; set; }
    }

    public class Limit//параметры границ (возможно имеется в виду возможный уклон или текущий показатель с этим уклоном)
    {
        public double AllowedSpeed { get; set; }
        public double AllowedAcceleration { get; set; }
        public double BoundarySpeed { get; set; }
        public double BoundaryAcceleration { get; set; }

        public double AllowedX { get; set; }
        public double AllowedY { get; set; }
        public double AllowedZ { get; set; }

        public double BoundaryX { get; set; }
        public double BoundaryY { get; set; }
        public double BoundaryZ { get; set; }
    }
    class Delta
    {

        static List<Parameter> ideal = new List<Parameter>();
        void DataSet(Parameter a) { ideal.Add(a); }

        static void prowl(double p) { }//просто возвращает рысканье
        static void acc(double a) { }//возврат ускорения
        static void accW(double a) { }//ускорение + предуприждение
        static void prowlW(double p) { }//предупреждает про негативный уклон от курса
        static void tangage(double t) { }//просто возвращает тангаж
        static void tangageW(double t) { }//просто возвращает тангаж и предупреждение
        static void speed(double s) { }// возврат скорости 
        static void speedW(double s) { }// возврат скорости и предупреждение
        static void crash() { } // разбились в общем (в перспективе Делегат)
        static void Main(string[] args)
        {
            Parser parse = new Parser();
            double lenght2=99999999999;
            foreach (Parameter item in ideal)
            {
                double lenght = Math.Pow(Math.Pow(item.Coord.X - parse.Xi, 2) + Math.Pow(item.Coord.Y - parse.Yi, 2) + Math.Pow(item.Coord.Z - parse.Zi, 2),0.5);
                if (lenght > lenght2)
                {
                    if (parse.Speed < item.Limit.BoundarySpeed + item.Speed) speed(parse.Speed);
                    else if (parse.Speed < item.Limit.BoundarySpeed + item.Speed) speedW(parse.Speed); else crash();
                    if (parse.Xi < item.Limit.AllowedX + item.Coord.X) acc(parse.Acceleration);
                    else if (parse.Xi < item.Limit.BoundaryX + item.Coord.X) accW(parse.Acceleration); else crash();
                    if (parse.Yi < item.Limit.AllowedY + item.Coord.Y) tangage(parse.Yi);
                    else if (parse.Yi < item.Limit.BoundaryY + item.Coord.Y) tangageW(parse.Yi); else crash();
                    if (parse.Zi < item.Limit.AllowedZ + item.Coord.Z) prowl(parse.Zi);
                    else if (parse.Zi < item.Limit.BoundaryZ + item.Coord.Z) prowlW(parse.Zi); else crash();
                    break;
                }
                else lenght2 = lenght;
            }
        }
    }
}